home *** CD-ROM | disk | FTP | other *** search
/ Almathera Ten Pack 3: CDPD 3 / Almathera Ten on Ten - Disc 3: CDPD3.iso / scope / 176-200 / scopedisk185 / calc / calcgadgets.mod < prev    next >
Text File  |  1995-03-19  |  8KB  |  320 lines

  1. IMPLEMENTATION MODULE CalcGadgets;
  2.  
  3.  
  4. FROM SYSTEM        IMPORT ADR, ADDRESS, BYTE, SHIFT, TERMPROC;
  5. FROM Intuition        IMPORT AddGList, RefreshGList, ActivationFlagSet,
  6.                    ActivationFlags, GadgetFlags, GadgetFlagSet,
  7.                    GadgetPtr, IntuiMessage, RemoveGList;
  8. FROM Pens        IMPORT SetAPen, SetDrMd, RectFill;
  9. FROM Rasters        IMPORT RastPortPtr, DrawingModeSet, Complement, Jam1;
  10. FROM DOSProcess        IMPORT Delay;
  11. FROM EasyGadgets    IMPORT StartList, DisposeList, currentList, AddDropShadow,
  12.                    listFailed, AddBoolGadget, nextBoolActivation,
  13.                    AddBorders, nextBorderFrontPen, currentIntui,
  14.                    currentGadget, nextFlags, nextIntuiTopEdge,
  15.                    nextIntuiLeftEdge, nextIntuiFrontPen,
  16.                    nextIntuiTextAttr;
  17. FROM CalcMenus        IMPORT wordSize, WSize, signed;
  18. FROM CalcDisplay    IMPORT DoLCD, window, textAttr;
  19. FROM CalcBrains        IMPORT EnterOperation, OpType, value, stoValue;
  20. FROM CalcValidate    IMPORT Addition, Multiplication, Subtraction;
  21.  
  22.  
  23. VAR
  24.   gadgets : ARRAY [B0..ClearEntry] OF GadgetPtr;
  25.  
  26.  
  27. PROCEDURE InverseGadget(gad:GadgetPtr);
  28. VAR
  29.   rp      : RastPortPtr;
  30.   olddrmd : DrawingModeSet;
  31. BEGIN
  32.   rp:=window^.RPort;
  33.   olddrmd:=rp^.DrawMode;
  34.   SetDrMd(rp,Complement);
  35.   RectFill(rp,gad^.LeftEdge,gad^.TopEdge,
  36.               gad^.LeftEdge+gad^.Width-1,gad^.TopEdge+gad^.Height-1);
  37.   SetDrMd(rp,olddrmd);  
  38. END InverseGadget;
  39.  
  40.  
  41. PROCEDURE FlashGadget(gad:GadgetPtr);
  42. BEGIN
  43.   InverseGadget(gad);
  44.   Delay(4);
  45.   InverseGadget(gad);
  46. END FlashGadget;
  47.  
  48.  
  49. PROCEDURE TerminateCalcGadgets;
  50. BEGIN
  51.   DisposeList(currentList);
  52. END TerminateCalcGadgets;
  53.  
  54.  
  55. PROCEDURE InitGadgetStuff(): BOOLEAN;
  56. VAR
  57.   width   : CARDINAL;
  58.   counter : GadgetType;
  59.   dummy   : INTEGER;
  60.  
  61.   (*$S-*)
  62.   PROCEDURE AddGad(left,top:INTEGER; name:ARRAY OF CHAR);
  63.   BEGIN
  64.     AddBoolGadget(left,top,width,9,name);
  65.     gadgets[counter]:=currentGadget;
  66.     INC(counter);
  67.  
  68.     IF HIGH(name)=0 THEN
  69.       INC(currentIntui^.LeftEdge,8);
  70.     ELSIF HIGH(name)=1 THEN
  71.       INC(currentIntui^.LeftEdge,4);
  72.     END;
  73.  
  74.     AddBorders();
  75.     AddDropShadow();
  76.   END AddGad;
  77.  
  78. BEGIN
  79.   StartList;
  80.  
  81.   nextBoolActivation:=ActivationFlagSet{RelVerify};
  82.   DEC(nextIntuiTopEdge,2);
  83.   DEC(nextIntuiLeftEdge,4);
  84.   nextIntuiFrontPen:=0;
  85.   nextIntuiTextAttr:=ADR(textAttr);
  86.  
  87.   counter:=B0;
  88.  
  89.   width:=60;
  90.   nextBorderFrontPen:=0;
  91.   AddGad(18,104,"0");
  92.   INC(currentIntui^.LeftEdge,16);
  93.   width:=26;
  94.   AddGad(18,90,"1");
  95.   AddGad(53,90,"2");
  96.   AddGad(88,90,"3");
  97.   AddGad(18,76,"4");
  98.   AddGad(53,76,"5");
  99.   AddGad(88,76,"6");
  100.   AddGad(18,62,"7");
  101.   AddGad(53,62,"8");
  102.   AddGad(88,62,"9");
  103.   AddGad(18,48,"A");
  104.   AddGad(53,48,"B");
  105.   AddGad(88,48,"C");
  106.   AddGad(18,34,"D");
  107.   AddGad(53,34,"E");
  108.   AddGad(88,34,"F");
  109.  
  110.   AddGad(127,62,"(");
  111.   AddGad(162,62,")");
  112.  
  113.   AddGad(88,104,"+/-");
  114.  
  115.   width:=60;
  116.   nextBorderFrontPen:=2;
  117.   AddGad(127,104,"=");
  118.   INC(currentIntui^.LeftEdge,16);
  119.  
  120.   width:=26;
  121.   AddGad(127,76,"+");
  122.   AddGad(162,76,"-");
  123.   AddGad(127,90,"*");
  124.   AddGad(162,90,"/");
  125.  
  126.   INCL(nextBoolActivation,GadgImmediate);
  127.   EXCL(nextBoolActivation,RelVerify);
  128.   AddGad(201,90,"BIN");
  129.   AddGad(236,90,"OCT");
  130.   AddGad(201,104,"DEC");
  131.   AddGad(236,104,"HEX");
  132.   EXCL(nextBoolActivation,GadgImmediate);
  133.   INCL(nextBoolActivation,RelVerify);
  134.  
  135.   AddGad(201,76,"STO");
  136.   AddGad(236,76,"RCL");
  137.  
  138.   AddGad(201,62,"«SH");
  139.   AddGad(236,62,"SH»");
  140.   AddGad(201,48,"«RO");
  141.   AddGad(236,48,"RO»");
  142.   AddGad(201,34,"«AS");
  143.   AddGad(236,34,"AS»");
  144.  
  145.   AddGad(127,48,"NOT");
  146.   AddGad(127,34,"AND");
  147.   AddGad(162,34,"OR");
  148.   AddGad(162,48,"XOR");
  149.  
  150.   nextBorderFrontPen:=3;
  151.   AddGad(201,17,"CA");
  152.   AddGad(236,17,"CE");
  153.  
  154.   IF NOT listFailed THEN
  155.     dummy:=AddGList(window,currentList,0,-1,NIL);
  156.     RefreshGList(currentList,window,NIL,-1);
  157.     InverseGadget(gadgets[VAL(GadgetType,ORD(Bin)+ORD(base))]);
  158.     GhostUnused;
  159.   END;
  160.  
  161.   TERMPROC(TerminateCalcGadgets);
  162.  
  163.   RETURN NOT listFailed;
  164. END InitGadgetStuff;
  165.  
  166.  
  167. PROCEDURE DoGadget(gadget:GadgetType): INTEGER;
  168. VAR
  169.   numBase : LONGCARD;
  170.   maxBit  : CARDINAL;
  171.   bit     : BOOLEAN;
  172.   backup  : LONGCARD;
  173. BEGIN
  174.   CASE base OF
  175.     |BINA: numBase:=2;
  176.     |OCTA: numBase:=8;
  177.     |DECI: numBase:=10;
  178.     |HEXA: numBase:=16;
  179.   ELSE
  180.   END;
  181.  
  182.   CASE wordSize OF
  183.     |WORD8 : maxBit:=7;
  184.     |WORD16: maxBit:=15;
  185.     |WORD32: maxBit:=31;
  186.   ELSE
  187.   END;
  188.  
  189.   IF resetValue & (gadget>=B0) & (gadget<=BF) THEN
  190.     value:=0;
  191.     resetValue:=FALSE;
  192.   END;
  193.  
  194.   CASE gadget OF
  195.     |B0..BF     : IF Multiplication(value,numBase) THEN
  196.                     backup:=value;
  197.                     IF (signed) & (LONGINT(value)<0) THEN
  198.                       value:=LONGINT(value)*LONGINT(numBase);
  199.                       IF Subtraction(value,LONGINT(ORD(gadget)-ORD(B0))) THEN
  200.                         value:=LONGINT(value)-LONGINT(ORD(gadget)-ORD(B0));
  201.                       ELSE
  202.                         value:=backup;
  203.                       END;
  204.                     ELSE
  205.                       value:=value*numBase;
  206.                       IF Addition(value,LONGCARD(ORD(gadget)-ORD(B0))) THEN
  207.                         value:=value+LONGCARD(ORD(gadget)-ORD(B0));
  208.                       ELSE
  209.                         value:=backup;
  210.                       END;
  211.                     END;
  212.                   END;
  213.     |SignInvert : value:=LONGCARD(-LONGINT(value));
  214.     |Sto        : stoValue:=value;
  215.     |Rcl        : value:=stoValue;
  216.     |ShiftLeft  : value:=SHIFT(value,1);
  217.     |ShiftRight : value:=SHIFT(value,-1);
  218.     |RotateLeft : bit:= (maxBit IN LONGBITSET(value));
  219.               value:=SHIFT(value,1);
  220.               IF bit THEN
  221.                 INC(value);
  222.               END;
  223.     |RotateRight: bit:= (0 IN LONGBITSET(value));
  224.                   value:=SHIFT(value,-1);
  225.                   IF bit THEN
  226.                     INC(value,LONGCARD(LONGBITSET{maxBit}));
  227.                   END;;
  228.     |AShiftLeft : ;
  229.     |AShiftRight: ;
  230.     |Not        : value:=LONGCARD(LONGBITSET{0..31}-LONGBITSET(value));
  231.     |ClearEntry : value:=0;
  232.     |Bin..Hex    : InverseGadget(gadgets[VAL(GadgetType,ORD(Bin)+ORD(base))]);
  233.                   base:=VAL(Base,ORD(gadget)-ORD(Bin));
  234.                   InverseGadget(gadgets[gadget]);
  235.                   GhostUnused;
  236.     |LeftParen  : EnterOperation(OpLeftParen);
  237.     |RightParen : EnterOperation(OpRightParen);
  238.     |Equal      : EnterOperation(OpEqual);
  239.     |Plus       : EnterOperation(OpPlus);
  240.     |Minus      : EnterOperation(OpMinus);
  241.     |Times      : EnterOperation(OpTimes);
  242.     |Divide     : EnterOperation(OpDivide);
  243.     |And        : EnterOperation(OpAnd);
  244.     |Or         : EnterOperation(OpOr);
  245.     |Xor        : EnterOperation(OpXor);
  246.     |ClearAll   : value:=0;
  247.                   EnterOperation(OpClearAll);
  248.   ELSE
  249.   END;
  250.  
  251.   DoLCD;
  252.   RETURN 0;
  253. END DoGadget;
  254.  
  255.  
  256. PROCEDURE HandleGadget(VAR intui:IntuiMessage; gadget:GadgetPtr): INTEGER;
  257. BEGIN
  258.   RETURN DoGadget(VAL(GadgetType,gadget^.GadgetID));
  259. END HandleGadget;
  260.  
  261.  
  262. PROCEDURE FakeGadget(gadget:GadgetType): INTEGER;
  263. BEGIN
  264.   IF (gadget<Bin) OR (gadget>Hex) THEN
  265.     FlashGadget(gadgets[gadget]);
  266.   END;
  267.  
  268.   RETURN DoGadget(gadget);
  269. END FakeGadget;
  270.  
  271.  
  272. PROCEDURE GhostUnused;
  273. VAR
  274.   gad   : GadgetPtr;
  275.   count : CARDINAL;
  276.   pos   : INTEGER;
  277. BEGIN
  278.   pos:=RemoveGList(window,gadgets[B0],16);
  279.  
  280.   gad:=gadgets[B0];
  281.   count:=16;
  282.   REPEAT
  283.     EXCL(gad^.Flags,GadgDisabled);
  284.     gad:=gad^.NextGadget;
  285.     DEC(count);
  286.   UNTIL count=0;
  287.  
  288.   CASE base OF
  289.     |BINA: gad:=gadgets[B2];
  290.            count:=14;
  291.     |OCTA: gad:=gadgets[B8];
  292.            count:=8;
  293.     |DECI: gad:=gadgets[BA];
  294.            count:=6;
  295.     |HEXA: count:=0;
  296.   END;
  297.  
  298.   WHILE count>0 DO
  299.     INCL(gad^.Flags,GadgDisabled);
  300.     gad:=gad^.NextGadget;
  301.     DEC(count);
  302.   END;
  303.  
  304.   pos:=AddGList(window,gadgets[B0],pos,16,NIL);
  305.   RefreshGList(gadgets[B0],window,NIL,16);
  306.  
  307.   pos:=RemoveGList(window,gadgets[SignInvert],1);
  308.   INCL(gadgets[SignInvert]^.Flags,GadgDisabled);
  309.   IF signed THEN
  310.     EXCL(gadgets[SignInvert]^.Flags,GadgDisabled);
  311.   END;
  312.   pos:=AddGList(window,gadgets[SignInvert],pos,1,NIL);
  313.   RefreshGList(gadgets[SignInvert],window,NIL,1);
  314. END GhostUnused;
  315.  
  316.  
  317. BEGIN
  318.   base:=DECI;
  319. END CalcGadgets.
  320.